﻿/*
数字游戏 
Time Limit:1000MS  Memory Limit:1024K

  
Description:
最近Catcher对数字游戏很感兴趣，他发明了一种新的游戏，
给出一个数N，问N是否能表示成某个正整数X的K次幂（K＞1），N可能有多种表示方法，
请找出最大的X并输出相应的K。例如 16＝2^4＝4^2,64＝4^3＝2^6=8^2则16应表示为4＾2，
64应表示为8＾2。 
	
Input:
每行一个正整数N，输入文件以0为结束标志。（0＜N＜10^8） 
Output:
每行有两个整数，如果能表示，则输出X　K，（中间用一个空格隔开）如果不能，则输出0　0； 
Sample Input:
5
4
16
27
0
Sample Output:
0 0
2 2
4 2
3 3

*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main()
{
	typedef unsigned long ulong;
	for (ulong n; EOF!=scanf("%u", &n), n;)
	{
		if(1==n)
			printf("1 1\n");
		else{
			unsigned x=unsigned(sqrt(double(n)))+1;
			ulong product=n+1;	//确保下面的循环第一次product>n
			unsigned k=1U;
			while (true)
			{
				if(1==x)
				{
					printf("0 0\n");
					break;
				}
				else if(product==n)
				{
					printf("%u %u\n", x, k);
					break;
				}
				else if(product>n)
				{
					do 
					{
						x--;
					}while (x && n%x);
						
					product=x;
					k=1U;
				}
				product *= x;
				++k;
			}
		}		
	}
	
	return EXIT_SUCCESS;
}
/*
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	for (unsigned n; cin>>n, n;)
	{
		if(1==n)
			cout<<1<<" "<<1<<endl;
		else{
			for (unsigned k=2;;k++)
			{	
				double x=pow(double(n), 1.0/double(k));
				if(fabs(x-1)<=1e-6)
				{
					cout<<0<<" "<<0<<endl;
					break;
				}
				else if(fabs(x-floor(x))<=1e-6)
				{
					cout<<unsigned(x)<<" "<<k<<endl;
					break;
				}
			}
		}

	}

	return EXIT_SUCCESS;
}
*/
/*
#include <stdio.h>
#include <math.h>
unsigned long powerof(unsigned long m, unsigned long n)
{
	unsigned long pw=1UL;
	while(n>0)
	{
		if(n & 0x1UL)
			pw *= m;
		m *= m;
		n >>= 1;
	}

	return pw;
}

int main()
{
	unsigned long p=0UL;
	while(EOF!=scanf("%u", &p) && p)
	{
		unsigned long x=(unsigned long)sqrt((double)p)+1UL;
		int k=2;
		bool flag = false;
		while(x>1)
		{
			unsigned long pw = pow((double)x, (int)k);
			if(p == pw)
			{
				printf("%u %u\n", x, k);
				flag = true;
				break;
			}
			else if(pw < p)
				++k;
			else
				--x;
		}
		if(!flag)
			printf("0 0\n");
	}

	return 0;
}
*/
